package com.zpz.framework.zpzoauth.common.extend;


import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateExtend {
    /**
     * 转换字符串时间 @param time @return @throws
     */
    public static Date toDate(String time) {
        return toDate(time, "yyyy-MM-dd HH:mm:ss");
    }


    public static Date date2date(Date date, String formatStr) {
        if (date == null)
        {
            return null;
        }
        SimpleDateFormat sdf = new SimpleDateFormat(formatStr);
        String str = sdf.format(date);
        try {
            date = sdf.parse(str);
        } catch (Exception e) {
            return null;
        }
        return date;
    }

    /**
     * 转换字符串时间 @param time @return @throws
     */
    public static Date toDate(String time, String format) {
        if (format == null || format.isEmpty())
        {
            format = "yyyy-MM-dd HH:mm:ss";
        }
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        try {
            return sdf.parse(time);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return new Date(1);
        }
    }

    /**
     * 格式化输出时间
     *
     * @param format 格式字符串，为空时使用 yyyy-MM-dd HH:mm:ss
     * @return
     */
    public static String getDate(String format) {
        if (format == null || format.isEmpty())
        {
            format = "yyyy-MM-dd HH:mm:ss";
        }
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        Date date = new Date();
        return Integer.parseInt(sdf.format(date)) + "";
    }

    /**
     * 格式化输出时间 yyyy-MM-dd HH:mm:ss
     *
     * @param date 时间
     * @return
     */
    public static String getString(Date date) {
        return getString(date, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 格式化输出时间 yyyy-MM-dd HH:mm:ss
     *
     * @param date 时间
     * @return
     */
    public static String getString(Date date, String format) {
        if (date == null)
        {
            return "";
        }
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }

    /**
     * 格式化输出时间
     * 格式字符串，为空时使用 yyyy-MM-dd HH:mm:ss
     *
     * @return
     */
    public static String getDate() {
        return getDate(null);
    }

    /**
     * 时间操作
     *
     * @param date
     * @param calendarType calendar.DATE 值
     * @param n
     * @return
     * @author zhangpanzhi 2017年5月16日
     */
    static Date addDate(Date date, int calendarType, int n) {
        if (date == null)
        {
            return null;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(calendarType, n);// 把日期往后增加一天.整数往后推,负数往前移动
        return calendar.getTime(); // 这个时间就是日期往后推一天的结果
    }

    /**
     * +天
     *
     * @param date
     * @param day
     * @return
     * @author zhangpanzhi
     */
    public static Date addDay(Date date, int day) {
        if (date == null)
        {
            return null;
        }
        return addDate(date, Calendar.DATE, day);
        // Calendar calendar = Calendar.getInstance();
        // calendar.setTime(date);
        // calendar.add(calendar.DATE,day);//把日期往后增加一天.整数往后推,负数往前移动
        // return calendar.getTime(); //这个时间就是日期往后推一天的结果
    }

    /**
     * +月
     *
     * @param date
     * @return
     * @author zhangpanzhi
     */
    public static Date addMonth(Date date, int month) {
        if (date == null)
            return null;
        return addDate(date, Calendar.MONTH, month);
    }

    /**
     * +时
     *
     * @param date
     * @return
     * @author zhangpanzhi
     */
    public static Date addHour(Date date, int hour) {
        if (date == null)
        {
            return null;
        }
        return addDate(date, Calendar.HOUR, hour);
    }

    /**
     * 两个时间相差的天数
     *
     * @param begin 开始时间
     * @param end   结束时间
     * @return
     * @author zhangpanzhi
     */
    public static int spanDay(Date begin, Date end) {
        if (begin == null || end == null)
        {
            return 0;
        }
        long spanSm = begin.getTime() - end.getTime();
        int d = (int) Math.ceil(spanSm / (1000 * 60 * 60 * 24));
        return d;
    }

    /**
     * date2比date1多的天数
     *
     * @param date1
     * @param date2
     * @return
     */
    public static int differentDays(Date date1, Date date2) {
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(date1);

        Calendar cal2 = Calendar.getInstance();
        cal2.setTime(date2);
        int day1 = cal1.get(Calendar.DAY_OF_YEAR);
        int day2 = cal2.get(Calendar.DAY_OF_YEAR);

        int year1 = cal1.get(Calendar.YEAR);
        int year2 = cal2.get(Calendar.YEAR);
        // 同一年
        if (year1 != year2)
        {
            int timeDistance = 0;
            for (int i = year1; i < year2; i++) {
                // 闰年
                if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
                {
                    timeDistance += 366;
                } else // 不是闰年
                {
                    timeDistance += 365;
                }
            }

            return timeDistance + (day2 - day1);
        } else // 不同年
        {
            System.out.println("判断day2 - day1 : " + (day2 - day1));
            return day2 - day1;
        }
    }
}
